﻿/**
 *		任务调度器
 * *noets       本任务调度器不支持多线程
 *@author		吴建凰
 *@date			2021年11月5日
 */
#ifndef OSS_TASKSCHEDULER_H_
#define OSS_TASKSCHEDULER_H_
#include "ossType.h"
#include "ossList.h"
#include "ossLock.h"
#include "ossObject.h"



#ifdef __cplusplus
/**
 *		 任务的回调函数
 *@pMsgParam	       消息参数
 *@iParamLen        消息大小
 *@return           无
 */
typedef void (OssObject::*OssTaskCallbackFun)(void* pMsgParam,int iParamLen);

class OssTaskScheduler:public OssObject
{
public:
	OssTaskScheduler(void);
	virtual ~OssTaskScheduler(void);
    
	/**
	 *		增加任务
     *@pcTaskReceiver	任务接收实例
	 *@taskFun		任务的回调函数
	 *@dwDelayMsecs	放入多长时间后执行(单位毫秒)
	 *@return			返回任务的标记
	 */
	Handle AddTask(void *pcTaskReceiver,OssTaskCallbackFun taskFun,DWord dwDelayMsecs);

     /**
      *     增加任务，带参数
      *@pcTaskReceiver	任务接收实例
      *@taskFun		任务的回调函数
      *@dwDelayMsecs	放入多长时间后执行(单位毫秒)
      *@return			返回任务的标记
      */
    Handle AddTask(void*pcTaskReceiver,OssTaskCallbackFun taskFun,void* pTaskParam,int iTaskParamLen,DWord dwDelayMsecs);

	/**
	 *		删除任务
	 */
	void DeleteTask(Handle htask);

    /**
     *      清除所有事件
     */
    void ClearAllTask();

	/**
	 *		重置执行时间
	 */
	void Rescheduler(Handle htask,DWord dwDelayMsecs);

	/**
	 *		单步执行
	 *@return	有任务执行返回0
	 *			没有任务则返回下一个任务的时间(微秒)
	 */
	DWord SingleStep();

    /**
     *      打印出所有任务
     */
    void PrintAllTask();

    /**
     *      删除指定接收者的所有任务
     */
    void DeleteAllTaskByReciver(void* ptReciver);

    /**
     *      获取当前还未处理完的任务数量
     */
    int GetTaskNumber();
private:
    /**
      *     新增删除任务
      *@pcTaskReceiver	任务接收实例
      *@taskFun		任务的回调函数
      *@dwDelayMsecs	放入多长时间后执行(单位毫秒)
      *@return			返回任务的标记
      */
    Handle AddDelTaskIn(void* pcTaskReceiver, OssTaskCallbackFun taskFun
                , void* pTaskParam, int iTaskParamLen, DWord dwDelayMsecs
                , int iStatus);

private:
	OssListNode						m_taskList;
    OssListNode						m_zeroTaskList;     //零等待时间的任务
    DWord							m_dwLastStepTime;
    int                             m_taskNum = 0;
};

#endif

#endif